package caches

import (
	"encoding/json"
	"fmt"
	"github.com/spf13/cast"
	"reflect"
	"strings"
)

const CombineSep = "::"
const CacheKeyPrefix = ""

// GenericKey 通用key生成（泛型）
func GenericKey[T int | int64 | string | []string | interface{}](k T) string {
	switch any(k).(type) {
	case int:
		d := any(k).(int)
		return fmt.Sprintf("%d", d)
	case int64:
		d := any(k).(int64)
		return fmt.Sprintf("%d", d)
	case string:
		d := any(k).(string)
		return fmt.Sprintf("%s", d)
	case []string:
		d := any(k).([]string)
		return fmt.Sprintf("%s", strings.Join(d, "."))
	}
	//默认进行json处理后生成可以不同的key
	s, _ := json.Marshal(k)
	return fmt.Sprintf("%s", string(s))
}

// ParseGenericKey 解析缓存key（泛型）
func ParseGenericKey[T int | int64 | string | []string | interface{}](k string) T {
	var v T
	d := k

	var res interface{}

	switch any(v).(type) {
	case int:
		res = cast.ToInt(d)
		return res.(T)
	case int64:
		res = cast.ToInt64(d)
		return res.(T)
	case string:
		res = d
		return res.(T)
	case []string:
		res = strings.Split(d, ".")
		return res.(T)
	}
	//默认进行json处理后生成可以不同的key

	tyRef := reflect.TypeOf(v)
	//针对指针进行特殊处理
	if tyRef.Kind() == reflect.Pointer {
		v = reflect.New(tyRef.Elem()).Interface().(T)
		json.Unmarshal([]byte(d), v)
	} else {
		json.Unmarshal([]byte(d), &v)
	}
	return v
}

// CombineKeys 多个key合并为一个key
func CombineKeys(keys ...string) string {
	return strings.Join(keys, CombineSep)
}

// SeparateKeys 分隔一个key为多个key
func SeparateKeys(key string) []string {
	return strings.Split(key, CombineSep)
}

// SeparateKeysFix 分隔一个key为多个key(保证返回的固定size的数组)
func SeparateKeysFix(key string, l int) []string {
	arr := make([]string, l, l)
	arr = strings.Split(key, CombineSep)
	if len(arr) < l {
		for i := len(arr); i < l; i++ {
			arr = append(arr, "")
		}
	}
	return arr
}
